<?php
// 24 * 7 * 3600 = 604800
ini_set('session.gc_maxlifetime', '604800');
session_set_cookie_params(604800);
session_start();
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

define('PRASINO', 'B8DB4D');		// πράσινο
define('KITRINO', 'FFFF33');		// κίτινο
define('VIOLETI', 'FF66A3');		// βιολετί
define('ZACHARI', 'FFFFA3');		// ζαχαρί
define('GALAZIO', '80CCCC');		// γαλάζιο
define('PORTOKALI', 'FF9933');		// πορτοκαλί
define('ACHROMO', 'FFFFDF');		// σχεδόν άσπρο

// Σε κάποιους (δωρεάν) servers στους οποίους ανέβασα το
// πρόγραμμα, παρουσιάστηκε το εξής φαινόμενο: Ο server
// προσθέτει σε κάθε σελίδα ένα κομμάτι HTML κώδικα μέσω
// του οποίου τρέχει κάποιον javascript κώδικα. Αυτό δεν
// επηρεάζει τη λειτουργία του προγράμματος όσο δεν κάνουμε
// Ajax requests. Εκεί υπάρχει σοβαρότατο πρόβλημα, καθώς
// αλλοιώνεται το περιεχόμενο της απάντησης. Σ' αυτό το
// πρόβλημα έδωσα την εξής λύση: κάθε σελίδα που καλείται
// μέσω του Ajax εκτυπώνει στο τέλος ένα συγκεκριμένο
// string (pattern) το οποίο είναι απίθανο να προέλθει
// ως «κανονικό» output. Έτσι, κατά την παραλαβή της
// απάντησης, σπάω το περιεχόμενο της απάντησης σε
// δύο κομμάτια με βάση αυτό το pattern και θεωρώ ότι
// η πραγματική απάντηση είναι το πρώτο κομμάτι. Το
// pattern ωρίζεται εδώ ως PHP σταθερά και αργότερα
// το «περνώ» και στο javascript περιβάλλον ως global
// μεταβλητή για να μπορώ να κάνω το «σπάσιμο» των
// απαντήσεων.

define('AJAX_SEP', '@p@i@n@e@z@a@');

class User {
	public $login = FALSE;
	public $name = FALSE;
	public $password = FALSE;
	public $email = FALSE;
	public $board = FALSE;
	public $date = FALSE;

	// Αν έχει περαστεί μια παράμετρος, τότε αυτή είναι το login name και προσπελαύνουμε
	// τον χρήστη με αυτό το login name.
	//
	// Αν έχει περαστεί και δεύτερη παράμετρος, τότε πρόκειται για το password, οπότε
	// προσπελαύνουμε τον χρήστη με login και password. Όταν δίνεται το password, τότε
	// είναι SHA1 κρυπτογραφημένο, καθώς έτσι αποθηκεύεται στην database.
	//
	// Αν δεν έχει περαστεί καμία παράμετρος, τότε προσπελαύνουμε τον τρέχοντα χρήστη,
	// εφόσον υπάρχει.

	function __construct($login = FALSE, $password = FALSE) {
		if ($login)
			$login = trim($login);

		if ((!$login) && session_set('login'))
			$login = $_SESSION['login'];

		if ($login) {
			global $pineza;
			if (isset($pineza) && isset($pineza->db)) {
				$query = "SELECT * FROM `user` WHERE (`login` = '" .  escape($login) . "'";
				if ($password)
					$query .= " AND `password` = '" .  escape($password) . "'";
				$query .= ")";

				$result = mysqli_query($pineza->db, $query);
				if (!$result) {
					lathos($this->login . ': user construction failed (' .
						mysqli_error($pineza->db) . ')');
				}
				else {
					$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
					if ($row) {
						mysqli_free_result($result);
						$this->login = $row['login'];
						$this->name = $row['name'];
						$this->password = $row['password'];
						$this->email = $row['email'];
						$this->board = $row['board'];
						$this->date = $row['date'];
					}
				}
			}
		}
	}
}

// Η κλάση `Globals' περιέχει όλα τα global αντικείμενα της εφαρμογής.
// Μέσα σε αυτά συγκαταλέγονται το όνομα του server στον οποίο τρέχει
// η εφαρμογή, το login name του χρήστη, το database connection κλπ.
// Στην αρχή κάθε σελίδας πρέπει να δημιουργούμε το global object
// `pineza':
//
//	$pineza = new Globals();
//
// Αυτό τρέχει τον constructor του αντικειμένου όπου τίθενται τα properties
// και ανοίγει η database. Επίσης εκτυπώνεται το πρώτο μέρος της σελίδας,
// δηλαδή τα βασικά της σελίδας και η αρχή του "head" section.
//
// Όσον αφορά στα Ajax requests, εκεί δημιουργούμε το global object
// `pineza' δίνοντας και παράμετρο FALSE, ώστε να δηλώσουμε ότι
// πρόκειται για batch διαδικασία και όχι για νέα σελίδα:
//
//	$pineza = new Globals(FALSE);
//

class Globals {
	// Η property `selida' δείχνει αν πρόκειται για HTML σελίδα
	// (TRUE), ή για batch πρόγραμμα (FALSE).
	public $selida = TRUE;

	// Η property `server' περιέχει το πλήρες pathname του server
	// στον οποίο τρέχει το πρόγραμμα. Στο τέλος υπάρχει slash (/).
	public $server = FALSE;

	// Πρόκειται για το login name του χρήστη. Τίθεται από την
	// αντίστοιχη session παράμετρο.
	public $login = FALSE;

	// Είναι το host της database.
	public $db_host = 'localhost';

	// Είναι το όνομα της database. Αν είχαμε πλήρη έλεγχο στους
	// servers που δοκιμάζουμε το πρόγραμμα, θα μπορούσε αυτό να
	// είναι ένα στατικό όνομα, αλλά εμείς είμαστε αναγκασμένοι να
	// το θέτουμε ανάλογα με τον server στον οποίο τρέχουμε το πρόγραμμα.
	public $db_name = FALSE;

	// Είναι το όνομα του χρήστη ο οποίος επικοινωνεί με την database.
	// Αυτό δεν έχει σχέση με το login name του χρήστη που τρέχει
	// το πρόγραμμα, αλλά τίθεται ανάλογα με τον server στον οποίο
	// τρέχει το πρόγραμμα.
	public $db_user = FALSE;

	// Είναι το password με το οποίο ανοίγουμε την database. Τίθεται
	// ανάλογα με τον server στον οποίο τρέχει το πρόγραμμα.
	public $db_password = FALSE;

	// Πρόκειται για το database connection.
	public $db = FALSE;

	// Η property `admpass' περιέχει το password του administrator
	// σε SHA1 κρυπτογραφημένη μορφή.

	public $admpass = 'bd97b530fc726cdb2b47be246e5e6eb7651c47b3';

	// Η property `user' είναι ο τρέχων χρήστης. Τίθεται μέσω της
	// μεθόδου `fetch_user()'.

	public $user = FALSE;

	function __construct($selida = TRUE) {
		if ($_SERVER['HTTP_HOST'] == '127.0.0.1') {
			$this->server = 'http://127.0.0.1/pineza/';
			$this->db_name = 'pineza';
			$this->db_user = 'root';
			$this->db_password = '';
		}
		else {
			$this->server = 'http://' . $_SERVER['SERVER_NAME'] . '/';
			switch ($_SERVER['SERVER_NAME']) {
			case 'pineza.orgfree.com':
				$this->db_name = '364653';
				$this->db_user = '364653';
				$this->db_password = 'par09oct';
				break;
			case 'pineza.eu5.org':
				$this->db_name = '82017';
				$this->db_user = '82017';
				$this->db_password = 'par09oct';
				break;
			case 'www.pineza.host56.com':
			case 'pineza.host56.com':
				$this->db_name = 'a9244006_pineza';
				$this->db_user = 'a9244006_pineza';
				$this->db_password = 'par09oct';
				$this->db_host = 'mysql9.000webhost.com';
				break;
			case 'www.pineza.info':
			case 'pineza.info':
				$this->db_name = 'panos62_pineza';
				$this->db_user = 'panos62_pineza';
				$this->db_password = 'par09oct';
				break;
			default:
				telos("{$_SERVER['SERVER_NAME']}: unknown server");
			}
		}

		if (perastike('logout'))
			unset($_SESSION['login']);

		if (session_set('login'))
			$this->login = $_SESSION['login'];

		$this->selida = $selida;
		if ($this->selida) {
			?>
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
				"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
			<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
				<title>Sticky Notes</title>
				<link rel="shortcut icon" type="image/vnd.microsoft.icon" href="<?php
					print $this->server; ?>favicon.ico" />
				<link rel="stylesheet" type="text/css" href="<?php
					print $this->server; ?>lib/standard.css" />
				<script type="text/javascript" src="<?php
					print $this->server; ?>lib/standard.js"></script>
				<script type="text/javascript">
					pineza.server = '<?php print $this->server; ?>';
					pineza.login = '<?php print ($this->login ? $this->login : ''); ?>';
					pineza.timeDif = <?php print time(); ?>;
					pineza.ajaxSeparator = '<?php print AJAX_SEP; ?>';
				</script>
			<?php
		}

		if ($this->db)
			telos('database is already open');

		$this->db = @mysqli_connect($this->db_host, $this->db_user, $this->db_password);
		if (!$this->db)
			telos('Database connection failed!<p class="query">' .
				mysqli_connect_error() . '</p>');

		mysqli_set_charset($this->db, 'UTF8');
		if (!mysqli_select_db($this->db, $this->db_name))
			telos('Cannot open database (' . $this->db_name . ')');
	}

	public function close_database() {
		if ($this->db)
			mysqli_close($this->db);

		$this->db = FALSE;
	}

	public function fetch_user($login = FALSE) {
		if (!$this->user) {
			if (!$login)
				$login = $this->login;

			$this->user = new User($login);
		}
	}
}

global $pineza;

function set_pineza($selida = FALSE) {
	global $pineza;
	if (!isset($pineza))
		$pineza = new Globals($selida);
}

function check_login() {
	global $pineza;
	set_pineza();

	if ((!perastike('login')) || (!$_REQUEST['login']))
		telos('no login name passed');

	if ($_REQUEST['login'] != $pineza->login)
		telos('access denied for user "'. $login . '"');
}

function check_board() {
	if (!perastike('board'))
		telos('board not passed');

	return($_REQUEST['board']);
}

function arxi_selidas() {
	global $pineza;
	if ($pineza->selida) {
		?>
		</head>
		<body style="background-image: url('<?php
			print $pineza->server; ?>images/wall.gif'); background-repeat: repeat;">
		<?php
		tool_bar();
	}
	else {
		telos('arxi_selidas: called in batch mode');
	}
}

function tool_bar() {
	global $pineza;
	?>
	<div class="toolBar">
		<table style="width: 100%;"><tr>
		<td class="tbldbg" style="width: 1px;">
			<a href="<?php print $pineza->server; ?>info/index.php">
				<img class="logoTab" alt="pineza logo" src="<?php
					print $pineza->server; ?>images/logo.png" />
			</a>
		</td>
		<td class="tbldbg">
			<span class="toolBarTab leftToolBarTab">
				<a href="<?php print $pineza->server; ?>index.php">
					Home
				</a>
			</span>
			<?php
			if (perastike('adminout'))
				unset($_SESSION['admin']);

			if (session_set('admin')) {
				?>
				<span class="toolBarTab leftToolBarTab"
					style="background-color: transparent;">
					<a href="<?php print $pineza->server; ?>admin/index.php">
						<span class="adminTab">Administrator</span>
					</a>
				</span>
				<?php
			}
			?>
		</td>
		<td id="noteTab" class="tbldbg" style="width: 1px;">
			<img class="noteTab" alt="new note" src="<?php
				print $pineza->server; ?>images/note.gif"
				title="Click for new post"
				onclick="return(newNote(window));" />
		</td>
		<td class="tbldbg">
			<div id="searchSection"></div>
		</td>
		<td class="tbldbg">
			<div id="alive" style="margin-top: -0.6em;">
			</div>
		</td>
		<td class="tbldbg" style="text-align: right;">
			<span class="toolBarTab rightToolBarTab">
				<a href="<?php print $pineza->server; ?>odigies/index.php">
					Help
				</a>
			</span>
			<span class="toolBarTab rightToolBarTab">
				<a title="Send email to us" href="mailto: info@pineza.info">
					Contact
				</a>
			</span>
			<?php
			if ($pineza->login) {
				?>
				<span class="toolBarTab rightToolBarTab"
					style="background-color: transparent;">
					<a href="<?php print $pineza->server; ?>account/index.php">
						<span class="accountTab">
							<?php print $pineza->login; ?>
						</span>
					</a>
				</span>
				<span class="toolBarTab rightToolBarTab"
					style="background-color: transparent;">
					[&nbsp;
					<a href="<?php print $pineza->server; ?>index.php?logout=yes">
						Logout
					</a>
					&nbsp;]
				</span>
				<?php
			}
			else {
				?>
				<span class="toolBarTab rightToolBarTab"
					style="background-color: transparent;">
					[&nbsp;
					<a href="<?php print $pineza->server; ?>account/index.php">
						Signup
					</a>
					&nbsp;]
				</span>
				<span class="toolBarTab rightToolBarTab"
					style="background-color: transparent;">
					[&nbsp;
					<a href="<?php print $pineza->server; ?>login/index.php">
						Login
					</a>
					&nbsp;]
				</span>
				<?php
			}
			?>
		</td>
		</tr></table>
	</div>
	<div class="grami"></div>
	<?php
}

function telos_selidas() {
	global $pineza;
	if (!$pineza->selida)
		telos('telos_selidas: called in batch mode');

	bottom_ribbon();
	?>
	</body>
	</html>
	<?php
}

function bottom_ribbon() {
	global $pineza;
	?>
	<div id="bottom" style="display: none;">
	<div class="grami"></div>
	<div class="bottomRibbon">
		<table style="width: 100%;"><tr>
		<td class="bottomRibbonTab leftBottomRibbonTab tbldbg" style="width: 1px;">
			<?php domain_banner(); ?>
		</td>
		<td class="bottomRibbonTab leftBottomRibbonTab tbldbg" style="width: 1px;">
			<?php hosting_banner(); ?>
		</td>
		<td class="bottomRibbonTab leftBottomRibbonTab tbldbg" style="width: 1px;">
			<a href="http://validator.w3.org/check?uri=referer"><img
				src="<?php print $pineza->server; ?>images/valid-xhtml10.png"
				alt="Valid XHTML 1.0 Transitional" height="20" width="60" />
			</a>
		</td>
		<td class="bottomRibbonTab leftBottomRibbonTab tbldbg" style="width: 1px;">
			<a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3"><img
				src="<?php print $pineza->server; ?>images/vcss.gif"
				alt="Valid CSS!" height="20" width="60"  />
			</a>
		</td>
		<td class="bottomRibbonTab leftBottomRibbonTab tbldbg">
			[&nbsp;<a href="<?php print $pineza->server; ?>copyright/index.php">
				Copyright
			</a>&nbsp;]
		</td>
		<td class="bottomRibbonTab rightBottomRibbonTab partidaTab tbldbg" style="text-align: right;">
			<span id="prevPartida">
			</span>
			<span id="partida">
			</span>
			<span id="nextPartida">
			</span>
			[&nbsp;<a href="#">Top of Page</a>&nbsp;]
		</td>
	</tr></table>
	</div>
	</div>
	<?php
}

function no_frame_support() {
	lathos("Your browser doesn't support iframes");
}

function lathos($msg = '*** ERROR ***') {
	global $pineza;
	if (isset($pineza->selida) && $pineza->selida) {
		?>
		<table>
		<tr>
		<td class="lathos">
			<?php print $msg; ?>
		</td>
		</tr>
		</table>
		<?php
	}
	else {
		print $msg . AJAX_SEP;
	}
}

function telos($msg = '*** FATAL ERROR ***', $stat = 0) {
	global $pineza;
	lathos($msg);
	if (isset($pineza) && isset($pineza->db))
		$pineza->close_database();
	die($stat);
}

function akiro($msg = '*** FATAL ERROR ***', $stat = 0) {
	global $pineza;
	if ($pineza->db) {
		mysqli_rollback($pineza->db);
		mysqli_close($pineza->db);
	}

	lathos($msg, $stat);
	die($stat);
}

function session_set($var) {
	if (!isset($_SESSION))
		return(FALSE);

	if (!is_array($_SESSION))
		return(FALSE);

	return (array_key_exists($var, $_SESSION));
}

function perastike($key) {
	return (is_array($_REQUEST) && array_key_exists($key, $_REQUEST));
}

function escape($s) {
	global $pineza;
	if (get_magic_quotes_gpc())
		$s = stripslashes($s);

	return(isset($pineza->db) ? mysqli_real_escape_string($pineza->db, $s) : $s);
}

function mikrografies($color) {
	global $pineza;
	set_pineza();
	$result = mysqli_query($pineza->db,
		"SELECT * FROM `note` WHERE `user` = '" .
		escape($pineza->login) . "' AND `board` = '" .
		escape($color) . "' ORDER BY `key` DESC");
	if (!$result) {
		lathos('<span style="font-size: 80%;">SQL error: ' .
			mysqli_error($pineza->db) . '</span>');
		return(FALSE);
	}

	while ($row = mysqli_fetch_array($result)) {
		?>
		<div class="mikrografia" style="background-color: #<?php
			print $row['color']; ?>;">
		</div>
		<?php
	}

	return(TRUE);
}

function domain_banner() {
	global $pineza;
	?>
	<iframe src="http://affiliate.godaddy.com/ad/<?php
		print '810FD32A22826EAD2AB0B4CDE6F0FAB8' .
			'E6DB65AF997393DBF334082D8AE8C7F7'; ?>"
		width="125" height="35" frameborder="0" scrolling="no"
		marginwidth="0" marginheight="0" hspace="0"
		allowtransparency="true">
	</iframe>
	<?php
}

function hosting_banner() {
	global $pineza;
	switch ($pineza->server) {
	case 'http://pineza.host56.com/':
	case 'http://www.pineza.host56.com/':
		?>
		<a href="http://www.000webhost.com/"
			onClick="this.href='http://www.000webhost.com/386182.html'"
			target="_blank">
			<img src="http://www.000webhost.com/images/banners/other/banner9.gif"
			alt="Web Hosting" border="0" style="width: 3.5cm;" />
		</a>
		<?php
		break;
	case 'http://pineza.eu5.org/':
	case 'http://pineza.orgfree.com/':
		?>
		<a href="http://www.freewebhostingarea.com/" target="_blank">
			<img src="<?php print $pineza->server; ?>images/freewhaBanner.jpg"
			alt="Free Web Hosting Area" style="height: 0.9cm;" />
		</a>
		<?php
		break;
	case 'http://127.0.0.1/pineza/':
		?>
		<a href="http://www.easyphp.org/" target="_blank">
			<img src="<?php print $pineza->server; ?>images/easyphpBanner.gif"
			alt="easyPHP Web Hosting" border="0" style="height: 0.6cm;" />
		</a>
		<a href="http://www.apachefriends.org/en/xampp.html" target="_blank">
			<img src="<?php print $pineza->server; ?>images/xamppBanner.jpg"
			alt="XAMPP Web Hosting" border="0" style="height: 0.6cm;" />
		</a>
		<?php
		break;
	default:
		?>
		<a target="_blank" href="<?php print 'https://secure.hostgator.com/' .
			'cgi-bin/affiliates/clickthru.cgi?id=panos1962'; ?>">
			<img src="<?php print $pineza->server; ?>images/HostGator.gif"
				width="80" height="20" alt="HostGator" />
		</a>
		<?php
		break;
	}
}

?>
